#ifndef EDGEDETECTOR_H
#define EDGEDETECTOR_H

#include <QImage>

class EdgeDetector
{
public:
    EdgeDetector();
    ~EdgeDetector();
	/**
	 *  \brief 一阶差分边缘检测算子，结合了水平和垂直两个一阶差分算子的结果
	 *  \param [in] image 待检测的图像，必须是 8 bits 灰度图像。
	 *  \return 边缘检测后的结果
	 */
    static QImage sideGradient(const QImage &image);
	
	/**
	 *  \brief 水平方向一阶差分边缘检测算子
	 *  \param [in] image 待检测的图像，必须是 8 bits 灰度图像。
	 *  \return 边缘检测后的结果
	 */
	static QImage horizontalGradient(const QImage &image);
	
	/**
	 *  \brief 垂直方向一阶差分边缘检测算子
	 *  \param [in] image 待检测的图像，必须是 8 bits 灰度图像。
	 *  \return 边缘检测后的结果
	 */	
	static QImage verticalGradient(const QImage &image);
	
	/**
	 *  \brief 水平方向二阶差分边缘检测算子
	 *  \param [in] image 待检测的图像，必须是 8 bits 灰度图像。
	 *  \return 边缘检测后的结果
	 */	
	static QImage horizontalGradient2(const QImage &image);
	
	/**
	 *  \brief 垂直方向二阶差分边缘检测算子
	 *  \param [in] image 待检测的图像，必须是 8 bits 灰度图像。
	 *  \return 边缘检测后的结果
	 */	
	static QImage verticalGradient2(const QImage &image);
	
	/**
     *  \brief Roberts 交叉边缘检测算子
	 *  \param [in] image 待检测的图像，必须是 8 bits 灰度图像。
	 *  \param [in] type  type = 0 表示 M- 算子， 1 表示 M+ 算子，2 表示两个算子的较大值 
	 *  \return 边缘检测后的结果
	 */	
	static QImage RobertsDetector(const QImage &image, int type);	
    /**
     *  \brief Sobel 交叉边缘检测算子
     *  \param [in] image 待检测的图像，必须是 8 bits 灰度图像。
     *  \param [in] type  type = 0 表示 Mx 算子， 1 表示 My 算子，2 表示两个算子的较大值
     *  \return 边缘检测后的结果
     */
    static QImage SobelDetector(const QImage &image, int type);
private:
};

#endif // EDGEDETECTOR_H
